Willkommen zur Einführung in die Relationenalgebra. In diesem Kapitel beschäftigen wir uns mit einer der theoretischen Grundlagen relationaler Datenbanken: der relationalen Algebra. Sie hilft uns dabei, formale Abfragen auf Datenbanktabellen zu beschreiben und zu verstehen. Die relationale Algebra ist eine formale Sprache. Sie erlaubt es uns, Datenbankrelationen, also Tabellen, zu verknüpfen, zu reduzieren oder gezielt zu durchsuchen. Dadurch lassen sich komplexe Informationen ableiten. Die definierten Operationen lassen sich auf Mengen von Relationen anwenden – etwa um Datensätze zu filtern, zu kombinieren oder umzubenennen. Wichtig ist: Jede dieser Operationen liefert wieder eine Relation als Ergebnis. Das bedeutet: Die relationale Algebra ist abgeschlossen. Ihre praktische Bedeutung zeigt sich darin, dass viele Abfragesprachen – wie SQL – auf diesen Konzepten basieren. Die theoretischen Operationen werden dabei durch sogenannte Datenbankoperatoren umgesetzt. Wenn eine Abfragesprache alle Operationen der relationalen Algebra ausdrücken kann, nennt man sie relational vollständig. Ein Ausdruck kann dabei aus mehreren verknüpften Operatoren bestehen. Und SQL ist tatsächlich relational vollständig – das ist ein Beweis für die Stärke und Flexibilität dieser Sprache. Ein minimales System der relationalen Algebra umfasst sechs grundlegende Operationen: Erstens die Projektion, zweitens die Selektion, drittens das Kreuzprodukt, viertens die Vereinigung, fünftens die Differenz und sechstens die Umbenennung. Alle weiteren, komplexeren Operationen können aus diesen sechs Grundoperationen zusammengesetzt werden. Noch ein paar Begriffe zur Erinnerung: Eine Relation entspricht einer Tabelle in der Datenbank. Sie besteht aus Attributen – das sind die Spalten – und Tupeln – das sind die einzelnen Zeilen oder Datensätze. Der erste Grundoperator ist die Selektion. Sie wird mit dem griechischen Buchstaben Sigma dargestellt. Mit einer Selektion legen wir fest, welche Tupel, also Zeilen, in das Ergebnis aufgenommen werden. Dazu formulieren wir einen sogenannten Selektionsausdruck – auch Prädikat genannt – zum Beispiel: „matrikelnummer größer als siebenhunderteintausend“. Nur Tupel, die diese Bedingung erfüllen, werden in die Ergebnismenge übernommen. Wenn R eine Relation ist, dann schreibt man „Sigma-Ausdruck von R“. Ein Beispiel zur Selektion macht das Prinzip anschaulich. Wir haben eine Tabelle R mit den Spalten A, B und C. Darin stehen vier Zeilen mit verschiedenen Werten. Wenn wir jetzt eine Selektion durchführen mit der Bedingung: Spalte A ist gleich eins, dann bleiben genau die Zeilen erhalten, in denen A den Wert eins hat. Im Ergebnis sehen wir zwei Tupel: eins, zwei, vier und eins, sechs, sieben. Wenden wir eine andere Selektionsbedingung an – zum Beispiel: C größer als sechs – dann bleiben alle Zeilen, bei denen C größer als sechs ist. Das trifft auf zwei Zeilen zu: vier, sechs, sieben und eins, sechs, sieben. Die Selektion hilft uns also, gezielt nur bestimmte Zeilen aus einer Tabelle zu extrahieren – je nachdem, welche Bedingung wir formulieren. In SQL würde man dazu schreiben: Select Sternchen from Student where Matrikelnummer größer siebenhunderteintausend. Die Relation heißt „student“, und das Selektionsprädikat ist „matrikelnummer größer siebenhunderteintausend“. Schauen wir uns jetzt ein konkretes Beispiel für eine Selektion an. Wir haben eine Tabelle „Mitarbeiter“ mit den Spalten: Personalnummer, Name, Vorname und Abteilung. Dort finden wir zum Beispiel Erwin Huber und Hugo Mayer, beide aus der Abteilung null eins, sowie Anton Müller aus Abteilung null zwei. Wenn wir nun nur die Mitarbeiter aus Abteilung null eins herausfiltern möchten, verwenden wir eine Selektion mit der Bedingung: Abteilung gleich null eins. Das Ergebnis ist eine neue Tabelle, in der nur noch Huber und Mayer enthalten sind. Weil die Ergebnisse auch immer Tabellen sind, ist SQL abgeschlossen! Die Bedingung wird als Selektionsausdruck geschrieben: Sigma Abteilung gleich null eins in Klammern Mitarbeiter. Jetzt kombinieren wir die Selektion mit dem Kreuzprodukt – und kommen damit zum sogenannten Join. Wir haben zwei Tabellen: „Mitarbeiter“ mit Personalien und „Abteilungen“ mit Nummer und Abteilungsname, zum Beispiel null eins für Buchhaltung und null zwei für Produktion. Wenn wir das Kreuzprodukt bilden, entsteht eine Kombination jeder Mitarbeiterzeile mit jeder Abteilungszeile – auch solche, die nicht zusammenpassen. Zum Beispiel: Erwin Huber wird einmal mit Buchhaltung und einmal mit Produktion kombiniert – obwohl er nur in einer Abteilung arbeitet. Daher setzen wir eine Selektion ein: Wir filtern nur die Kombinationen, bei denen Abteilung gleich A-Nummer ist – also wo die Abteilungen wirklich übereinstimmen. Das schreiben wir als: Sigma Abteilung gleich A-Nummer in Klammern Mitarbeiter Kreuz Abteilungen. Das Ergebnis ist, dass nur die korrekten Kombinationen bleiben – etwa Huber mit Buchhaltung. Ein Join ist also eine Verknüpfung, bei der nur passende Zeilen beider Tabellen übernommen werden. Der nächste Grundoperator ist die Projektion. Sie wird mit dem griechischen Buchstaben Pi dargestellt. Bei der Projektion geht es – im Gegensatz zur Selektion – nicht darum, welche Zeilen wir behalten, sondern welche Spalten. Wir wählen also gezielt bestimmte Tabellenspalten aus, die uns interessieren. Diese Auswahl nennt man auch Projektionsliste oder Attributliste – in der relationalen Algebra mit dem griechischen Buchstaben Beta bezeichnet. Das ist die Menge aller Spalten, die in der Ergebnisrelation auftauchen sollen. Wichtig dabei: Die Spalten, die wir angeben, müssen natürlich auch in der Ausgangsrelation R enthalten sein. Außerdem: Duplikate werden automatisch entfernt – das heißt, wenn zwei Zeilen in den gewählten Spalten identisch wären, tauchen sie im Ergebnis nur einmal auf. Formal schreibt man: Pi hoch Beta von R – also die Projektion der Relation R auf die Attributliste Beta. Ein einfaches Beispiel zeigt, wie eine Projektion funktioniert. Wir haben eine Tabelle R mit den Spalten A, B und C. Wenn wir eine Projektion auf A und B durchführen – also Pi A, B von R – erhalten wir eine neue Tabelle mit nur diesen beiden Spalten. Die Werte aus Spalte C werden dabei entfernt. Das Ergebnis enthält: eins, zwei – vier, fünf – und eins, drei. Gehen wir noch weiter und projizieren nur auf Spalte A, dann reduziert sich die Tabelle auf: eins, vier und noch einmal eins. Da die Projektion automatisch doppelte Zeilen entfernt, bleibt im Endergebnis nur: eins und vier. Das zeigt: Die Projektion hilft, gezielt bestimmte Spalten zu betrachten – und stellt sicher, dass jede Kombination nur einmal vorkommt. In SQL lautet das: Select Nachname, Matrikelnummer from Student. Das bedeutet: Die Relation ist wieder „student“ und die Projektionsliste besteht aus „nachname“ und „matrikelnummer“. Ein weiteres Beispiel zeigt die Projektion anhand einer Tabelle mit Mitarbeitenden. Wir haben eine Tabelle mit vier Spalten: Personalnummer, Name, Vorname und Abteilung. Wenn wir nun eine Projektion auf Name und Abteilung durchführen – also Pi Name, Abteilung von Mitarbeiter – dann erhalten wir eine neue Tabelle mit nur diesen beiden Spalten. Im Zwischenergebnis sehen wir: Der Name Mayer kommt zweimal vor – beide Male mit der Abteilung null eins. Da beide Zeilen in den gewählten Spalten identisch sind, wird eine davon bei der Projektion entfernt. Das Endergebnis zeigt also nur noch die drei eindeutigen Kombinationen: Huber in Abteilung null eins, Mayer in Abteilung null eins und Müller in Abteilung null zwei. Dieses Beispiel zeigt nochmal: Die Projektion reduziert nicht nur die Spalten, sondern entfernt auch automatisch doppelte Zeilen.